/*
 * @lc app=leetcode.cn id=859 lang=typescript
 *
 * [859] 亲密字符串
 */

// @lc code=start
function buddyStrings(s: string, goal: string): boolean {
    // 长度不等，直接再见
    if (s.length !== goal.length) return false;
    if (s === goal) {
        // 同样字符串，但是有重复字符
        let cache = new Set<string>();
        for (let i = 0; i < s.length; i++) {
            const element = s[i];
            if (cache.has(element)) {
                return true;
            } else {
                cache.add(element);
            }
        }
        return false;
    }
    // 非同样字符串
    let stack0 = [];
    let compared = false;
    let final = false;
    for (let i = 0; i < s.length; i++) {
        if (s[i] !== goal[i]) {
            // 当比较过后，再次不同
            if (compared) return false;
            if (stack0.length === 0) {
                // 第一次肯定是没有长度的
                stack0.push(s[i], goal[i]);
            } else {
                // 第二次进行交叉比较，相等即说明可以
                if (stack0[0] === goal[i] && stack0[1] === s[i]) {
                    final = true;
                }
                compared = true;
            }
        }
    }
    return final;
}
// @lc code=end
